ts 嵌套包导出类型为 any 的问题
最近遇到 pnpm 模块打包类型问题,大致表现为:多层包嵌套后 type import(另一个包) 这样的类型会无法识别,然后变成 any
也就是存在 包 A B C D ,他们之间的依赖关系是 D 依赖 C 依赖 B 依赖 A
这个时候 包C 中的 import * as aApi from '包B/api' 在 包D中是无法识别的,所以这个 aApi 的类型就变成了 any,但是在 包C中使用是非常正常的, 为什么在包 D 中就无法识别了?
注意 我不希望 包C 直接引用包A,因为包B的作用就是用来作为中间层屏蔽这些细节的
不是生成的代码无法使用,单纯是 tsc 生成的类型在包D中无法使用,但是在包C中是能够使用的
仔细分析问题后我发现这样多级依赖 ts 应该是可以正确识别的,唯一的问题在于 包C 的类型打包时生成的链接是直接引用 包A的,但是包B隔离了包A (pnpm 构造的依赖树并非扁平的),这导致其他包引用包C得到的类型是错误的,但包B是正确的,包C由于使用中实际是按 ts 文件的类型走,所以也是正确的,就是包C打包后的类型不对(直接引用了包A)
于是我将寻找方案聚焦到了包C中,怎么才能让包C打包出来的类型是正确的引用包B而非包A?
注:直接将包 ABC 全部提升到顶层应该也是可以解决问题的,但我不希望这么做。(使用 public-hoist-pattern 配置)
于是发现了这个方案:再强制 as 一遍,使用type import导入
我发先这样生成的d.ts文件就会正确的引用包B而非包A了